package cn.java.sort;

import java.awt.geom.FlatteningPathIterator;
import java.util.Arrays;

/**
 * 冒泡排序 2019-11-03 冒泡排序(Bubble Sort) 又称为气泡排序或泡沫排序，它是一简单的排序算法。它会遍历若干次要排序的数列
 * 每次遍历时，它都会从前往后一次的比较两个相邻的数的大小，如果前者比后者大，则交换他们的位置。
 * 这样，一次遍历之后，最大的元素就在数列的末尾，采用相同的方法再次遍历时，第二大的元素就被排列在最大元素之前，重复此操作，知道整个数列多有序为止
 * 
 * @author zjb
 *
 */
public class BubbleSort {

	/**
	 * 冒泡排序 (改进版)
	 * 
	 * @param a
	 *            --待排序的数组
	 * @param n
	 *            --待排序的数组长度
	 */
	public static void bubbleSort(int[] arr, int n) {
		int i, j;
		int falg = 0; // 标记
		for (i = n - 1; i > 0; i--) {
			// 将n[0...i]中最大的数据放到末尾
			for (j = 0; j < i; j++) {
				if (arr[j] > arr[j + 1]) {
					// 交换arr[j]和arr[j+1]
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;

					falg = 1; // 若发生改变，则设标记为1
				}
			}
			if (falg == 0) {
				break; // 若没发生变化，则说明数列已有序。
			}
		}
	}

	/**
	 * 冒泡排序 简单
	 * 
	 * @param arr
	 *            --待排序的数组
	 * @param n
	 *            --待排序数组的长度
	 */
	public static void bubbleSort2(int[] arr, int n) {

		for (int i = 0; i < n - 1; i++) {
			for (int j = 0; j < n - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}

	}

	/**
	 * 冒泡排序
	 * 
	 * @param source
	 *            --待排序的数组
	 */
	public static void bubbleSort(int[] source) {
           
		for(int i=source.length-1;i>0;i--) {
			for(int j=0;j<i;j++) {
				if(source[j]>source[j+1]) {
					swap(source, j, j+1);
				}
			}
		}
	}

	private static void swap(int[] soure, int x, int y) {
		int temp = soure[x];
        soure[x]=soure[y];
        soure[y]=temp;
	}

	public static void main(String[] args) {
		int[] arr = { 2, 3, 1, 4, 6, 5, 8, 5, 7 };
		bubbleSort(arr);
		System.out.println(Arrays.toString(arr));
	}

}
